home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 2.iso / dist / fw_glimpse.idb / usr / freeware / src / glimpse-3.0 / libtemplate / util / host.c.z / host.c
C/C++ Source or Header  |  1997-09-09  |  4KB  |  141 lines

  1. static char rcsid[] = "$Id: host.c,v 1.12 1995/02/04 01:37:53 hardy Exp $";
  2. /*
  3.  *  host.c - Retrieves full DNS name of the current host
  4.  *
  5.  *  Darren Hardy, hardy@cs.colorado.edu, April 1994
  6.  *
  7.  *  ----------------------------------------------------------------------
  8.  *  Copyright (c) 1994, 1995.  All rights reserved.
  9.  *  
  10.  *          Mic Bowman of Transarc Corporation.
  11.  *          Peter Danzig of the University of Southern California.
  12.  *          Darren R. Hardy of the University of Colorado at Boulder.
  13.  *          Udi Manber of the University of Arizona.
  14.  *          Michael F. Schwartz of the University of Colorado at Boulder. 
  15.  *  
  16.  *  This copyright notice applies to all code in Harvest other than
  17.  *  subsystems developed elsewhere, which contain other copyright notices
  18.  *  in their source text.
  19.  *  
  20.  *  The Harvest software was developed by the Internet Research Task
  21.  *  Force Research Group on Resource Discovery (IRTF-RD).  The Harvest
  22.  *  software may be used for academic, research, government, and internal
  23.  *  business purposes without charge.  If you wish to sell or distribute
  24.  *  the Harvest software to commercial clients or partners, you must
  25.  *  license the software.  See
  26.  *  http://harvest.cs.colorado.edu/harvest/copyright,licensing.html#licensing.
  27.  *  
  28.  *  The Harvest software is provided ``as is'', without express or
  29.  *  implied warranty, and with no support nor obligation to assist in its
  30.  *  use, correction, modification or enhancement.  We assume no liability
  31.  *  with respect to the infringement of copyrights, trade secrets, or any
  32.  *  patents, and are not responsible for consequential damages.  Proper
  33.  *  use of the Harvest software is entirely the responsibility of the user.
  34.  *  
  35.  *  For those who are using Harvest for non-commercial purposes, you may
  36.  *  make derivative works, subject to the following constraints:
  37.  *  
  38.  *  - You must include the above copyright notice and these accompanying 
  39.  *    paragraphs in all forms of derivative works, and any documentation 
  40.  *    and other materials related to such distribution and use acknowledge 
  41.  *    that the software was developed at the above institutions.
  42.  *  
  43.  *  - You must notify IRTF-RD regarding your distribution of the 
  44.  *    derivative work.
  45.  *  
  46.  *  - You must clearly notify users that your are distributing a modified 
  47.  *    version and not the original Harvest software.
  48.  *  
  49.  *  - Any derivative product is also subject to the restrictions of the 
  50.  *    copyright, including distribution and use limitations.
  51.  */
  52. #include <stdio.h>
  53. #include <stdlib.h>
  54. #include <string.h>
  55. #include <unistd.h>
  56. #include <pwd.h>
  57. #include <ctype.h>
  58. #include <sys/param.h>
  59. #include <sys/types.h>
  60. #include <sys/socket.h>
  61. #include <netinet/in.h>
  62. #include <arpa/inet.h>
  63. #include <netdb.h>
  64. #include "util.h"
  65.  
  66. #ifndef MAXHOSTNAMELEN
  67. #define    MAXHOSTNAMELEN  256
  68. #endif
  69.  
  70. /*
  71.  *  getfullhostname() - Returns the fully qualified name of the current 
  72.  *  host, or NULL on error.  Pointer is only valid until the next call
  73.  *  to the gethost*() functions.
  74.  */
  75. char *getfullhostname()
  76. {
  77.     struct hostent *hp;
  78.     char buf[MAXHOSTNAMELEN + 1];
  79.     extern int gethostname();    /* UNIX system call */
  80.  
  81.     if (gethostname(buf, MAXHOSTNAMELEN) < 0)
  82.         return (NULL);
  83.     if ((hp = gethostbyname(buf)) == NULL)
  84.         return (NULL);
  85.     return (hp->h_name);
  86. }
  87.  
  88. /*
  89.  *  getmylogin() - Returns the login for the pid of the current process,
  90.  *  or "nobody" if there is not login associated with the pid of the
  91.  *  current process.  Intended to be a replacement for braindead getlogin(3).
  92.  */
  93. char *getmylogin()
  94. {
  95.     static char *nobody_str = "nobody";
  96.     uid_t myuid = getuid();
  97.     struct passwd *pwp;
  98.  
  99.     pwp = getpwuid(myuid);
  100.     if (pwp == NULL || pwp->pw_name == NULL)
  101.         return (nobody_str);
  102.     return (pwp->pw_name);
  103. }
  104.  
  105. /*
  106.  *  getrealhost() - Returns the real fully qualified name of the given
  107.  *  host or IP number, or NULL on error.  
  108.  */
  109. char *getrealhost(s)
  110. char *s;
  111. {
  112.     char *q;
  113.     struct hostent *hp;
  114.     int is_octet = 1, ndots = 0;
  115.     unsigned int addr = 0;
  116.  
  117.     if (s == NULL || *s == '\0')
  118.         return (NULL);
  119.  
  120.     for (q = s; *q; q++) {
  121.         if (*q == '.') {
  122.             ndots++;
  123.             continue;
  124.         } else if (!isdigit(*q)) {    /* [^0-9] is a name */
  125.             is_octet = 0;
  126.             break;
  127.         }
  128.     }
  129.  
  130.     if (ndots != 3)
  131.         is_octet = 0;
  132.  
  133.     if (is_octet) {
  134.         addr = inet_addr(s);
  135.         hp = gethostbyaddr((char *) &addr, sizeof(unsigned int), AF_INET);
  136.     } else {
  137.         hp = gethostbyname(s);
  138.     }
  139.     return (hp != NULL ? strdup(hp->h_name) : NULL);
  140. }
  141.